import threading
from time import sleep


class Foo(object):
    def __init__(self):
        self.num = 0


foo = Foo()


def task(num):
    foo.num = num
    sleep(1)
    print(foo.num)


# for i in range(4):
#     t = threading.Thread(target=task, args=(i,))
#     t.start()

# 3
# 3
# 3
# 3

# local 对象，当线程成调用，为每个线程开辟一个空间存储变量，后面线程读取到的还是自己线程所定义的变量
tl = threading.local()


def task1(num):
    tl.num = num
    sleep(1)
    print(tl.num)


# for i in range(4):
#     t = threading.Thread(target=task1, args=(i,))
#     t.start()

# 3
# 0
# 1
# 2


# def task2():
#     print(threading.get_ident())
#
#
# for i in range(5):
#     t = threading.Thread(target=task2)
#     t.start()

# 2024年5月29日16:09:57
# 自定义thread local

class Local:
    def __init__(self):
        # 调用父类的设置属性，如果使用self.storage = {} 会调用自己的__setattr__出现无限递归
        object.__setattr__(self, 'storage', {})

    def __setattr__(self, key, value):
        ident = threading.get_ident()
        if ident in self.storage:
            self.storage[ident][key] = value
        else:
            self.storage[ident] = {key: value}

    def __getattr__(self, item):
        ident = threading.get_ident()
        if ident in self.storage:
            value = self.storage[ident].get(item, None)
            return value
        else:
            return


local = Local()


def task3(num):
    local.x = num
    sleep(1)
    print(threading.get_ident(), local.x)


# for i in range(4):
#     t = threading.Thread(target=task3, args=(i,))
#     t.start()

# 2024年5月29日16:25:26


#  MyNameIsTom 反转 TomIsNameMy
#  三个排序
# 出圈问题，100个人报数，1-3,3的人出列，报数结尾后接着报数，最后保留2个人为：58、91
# # 找出数组中，子数组求和最大值  如[-1,3,-2,5] 最大值 3-2+5=6 # pass
#  三数之和等于0 # pass

# 开始算法题练习 # pass
# 梳理账务 # pass
# 练习用例编写 # pass
# 面试经验总结回顾 #  
# 学习flask上下文
# 拖地
# 面试
# 跑步
# 洗澡


# 出圈问题 # 2024年5月31日16:13:15
# list1 = list(range(1,101))
# print(list1)
# num = 0
#
# while len(list1) > 2:
#     for i in range(len(list1)):
#         num += 1
#         if num == 3:
#             list1[i] = 0
#             num = 0
#     list1 = [i for i in list1 if i != 0]
#
# print(list1)
# # 2024年5月31日16:16:40

# 1 11 21 1211 111221 # 输出前10项
# 2024年5月31日16:19:51
# 15分钟内
def func1(n):
    if n < 1:
        return
    if n == 1:
        return ["1"]

    list1 = ["1"]
    temp = ""
    t = ""

    for i in range(n-1):
        item = list1[-1]
        for i in str(item):
            if not temp:
                temp += i
            else:
                if i == temp[-1]:
                    temp += i
                else:
                    t += str(len(temp)) + temp[0]
                    temp = i
        else:
            if temp:
                t += str(len(temp)) + temp[0]

        list1.append(t)
        t = ""
        temp = ""
    return list1


print(func1(1))
print(func1(6))
# 2024年5月31日16:36:01  # 16分钟


# 编写微信转账用例
# UI
# 功能： 输入金额，正数、小数，最小、最大边界，下一步，转账前校验身份实名，实名未实名校验
# 下一步，余额足够，余额不足，储蓄卡，信用卡不行
# 下一步，储蓄卡金额充足，金额不足
# 接收方看到转账，退回或者接收
# 接口：期间调用的接口参数校验，调用三方接口失败，超时验证
# 数据：数据流转正确
# 性能：频繁转账校验，同一时间多个用户都调用转账功能支持
# 安全：频繁转账，异地挡路转账，转账接口日志是否暴露信息
# 上下游 # 转账应该要使用（储蓄卡、余额，转账后是否扣减） 接收方转账成功，是否入账
# 移动： 兼容（屏幕尺寸、安卓、IOS）、网络（345G 弱网 无网络提示） # CPU 内存 耗电


# 面试经验复习
# 洗澡
